#include "stm32f10x.h"                 // Device header
#include "Delay.h"
#include "Btn.h"
#include "OLED.h"
#include "CountSensor.h"
#include "Encoder.h"
#include "Timer.h"
#include "PWM.h"
#include "Servo.h"
#include "Motor.h"
#include "InputCapture.h"
#include "Encoder_TIM.h"
#include "AD.h"
#include "DMAConfig.h"
#include "Serial.h"
#include "I2C_Soft.h"
#include "MPU6050.h"
#include "W25Q64.h"
#include "SPI_Soft.h"
#include "SPI_Periph.h"
#include "MyRTC.h"
#include "DAC.h"
#include "IR.h"
#include "GreeAircon.h"
#include "SHT40.h"
#include "I2C.h"
#include "ESP8266.h"

//向panel发送数据：<0%3d%2d> 表示温度和湿度
//panel发来的控制指令：<(0)>表示关机 <(1%2d%1d)>表示温度和风速设定 

void MainLoop(void);


//extern int StatusCode;
//int main(void) {
//	IR_Receive_Init();
//	Serial_Init();
//	Serial_Printf("hello");
//	while(1) {
//		if(StatusCode) {
//			Delay_s(1);
//			Print_QUe();
//			while(1);
//		}
//	}
//}
int main(void)
{
//	GreeAircon_Init();
//	while(1) {
//		GreeAircon_SetStatus(25,0);
//		Delay_s(2);
//		GreeAircon_SetStatus(24,0);
//		Delay_s(2);
//	}
//	return 0;
	ESP8266_Init();
	OLED_Init();
	IR_Receive_Init();
	GreeAircon_Init(); //IR_Send_Init();
	SHT40_Init();
	IR_Enlight();
	ESP8266_StartServer();
	MainLoop();
}
//u16 dataC;

//void MyAD_Init(u32 destAddr)`
//{
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
//	
//	RCC_ADCCLKConfig(RCC_PCLK2_Div6); //分频 ADCCLK = 72Mhz/6=12Mhz
//	
//	GPIO_InitTypeDef GPIO_InitStructure;
//	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入模式
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ;
//	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//	GPIO_Init(GPIOA,&GPIO_InitStructure);
//	
//	//配置adc1，选定通道3，规则组的首位，采样时间为55个周期
//	ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_55Cycles5);
//	
//	ADC_InitTypeDef ADC_InitStructure;
//	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式以及双AD模式
//	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐
//	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //触发源选择软件触发
//	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //单次转换
//	ADC_InitStructure.ADC_ScanConvMode = DISABLE; //非扫描模式
//	ADC_InitStructure.ADC_NbrOfChannel = 1;
//	ADC_Init(ADC1,&ADC_InitStructure);
//	
//	DMA_InitTypeDef DMA_InitStructure;
//	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;
//	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//Byte,Half_Word(16bit),Word(32bit)
//	DMA_InitStructure.DMA_PeripheralInc  = DMA_PeripheralInc_Disable;//不自增
//	DMA_InitStructure.DMA_MemoryBaseAddr = destAddr;
//	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
//	DMA_InitStructure.DMA_MemoryInc  = DMA_MemoryInc_Enable;
//	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//传输方向：外设作为传输起点
//	DMA_InitStructure.DMA_BufferSize = 1;//传输次数
//	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//还有Circular为自动重装模式
//	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//内存到内存（实则为开启软件触发）（disable为硬件触发
//	DMA_InitStructure.DMA_Priority =  DMA_Priority_Medium;//有多个通道时可以控制通道优先级
//	DMA_Init(DMA1_Channel1,&DMA_InitStructure);
//	
//	DMA_Cmd(DMA1_Channel1,ENABLE);
//	ADC_DMACmd(ADC1,ENABLE);//开启DMA的Adc触发源
//	ADC_Cmd(ADC1,ENABLE);
//	
//	ADC_ResetCalibration(ADC1); //进行校准
//	while(ADC_GetResetCalibrationStatus(ADC1)/* == SET*/);
//	ADC_StartCalibration(ADC1);
//	while(ADC_GetCalibrationStatus(ADC1));
//}

//void MyAD_TransferValue(void)
//{
//	DMA_Cmd(DMA1_Channel1,DISABLE);
//	DMA_SetCurrDataCounter(DMA1_Channel1,1);
//	DMA_Cmd(DMA1_Channel1,ENABLE);
//	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
//	while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);//等待传输完成
//	DMA_ClearFlag(DMA1_FLAG_TC1);
//}

//int main()
//{
//	Serial_Init();
//	Serial_Init2();
//	DAC1_Init();
//	OLED_Init();
//	MyAD_Init((u32)&dataC);
//	DAC1_SetVol(500);
//	
//	while(1) {
//		MyAD_TransferValue();
//		OLED_ShowNum(1,1,dataC/4096.0*3300,4);
//		Delay_ms(100);
//	}
//}





//int main()
//{
//	OLED_Init();
//	
//	MyRTC_Init();
//	
//	
//	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
//	RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);
//	
//	PWR_BackupAccessCmd(ENABLE);
//	
//	//BKP_WriteBackupRegister(BKP_DR1,0x1234);
//	OLED_ShowHexNum(1,1,BKP_ReadBackupRegister(BKP_DR1),4);
//	while(1){
//		OLED_ShowNum(2,1,RTC_GetCounter(),10);
//	}
//}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//>>>>>>>>>>>>>>>>>>>>>>main for SPI>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//u8 dataout[] = {1,2,3,4,45,6};
//u8 datain[6];

//int main(void)
//{
//	u8 uid;
//	u16 did;
//	OLED_Init();
//	W25Q64_Init();
//	W25Q64_ReadID(&uid,&did);
//	OLED_ShowHexNum(1,1,uid,2);
//	OLED_ShowHexNum(1,4,did,4);
//	W25Q64_SectorErase(0x000000);//后三位是同一个扇区里的
//	W25Q64_PageProgram(0x000000,dataout,6);
//	W25Q64_ReadData(0x000000,datain,6);
//	OLED_ShowHexNum(2,1,datain[0],2);
//	OLED_ShowHexNum(2,3,datain[1],2);
//	OLED_ShowHexNum(2,5,datain[2],2);
//	OLED_ShowHexNum(2,7,datain[3],2);
//	OLED_ShowHexNum(3,1,datain[4],2);
//	OLED_ShowHexNum(3,3,datain[5],2);
//	while(1){
//		
//	}
//}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//>>>>>>>>>>>>>>>>>>>>>>main for I2C>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//int main_for_I2C(void)
//{
//	OLED_Init();
//	OLED_ShowHexNum(1,5,1,1);
//	MPU6050_Init();
//	MPU6050_WriteRegister(0x6b,0x00); //解除睡眠
//	MPU6050_WriteRegister(0x19,0xaa);
//	u8 id = MPU6050_ReadRegister(0x75);
//	
//	OLED_ShowHexNum(1,1,id,4);
//	MPU6050_Data mdata = MPU6050_GetData();
//	while(1){
//		mdata = MPU6050_GetData();
//		OLED_ShowSignedNum(2,1,mdata.AccX,5);
//		OLED_ShowSignedNum(3,1,mdata.AccY,5);
//		OLED_ShowSignedNum(4,1,mdata.AccZ,5);
//		OLED_ShowSignedNum(2,8,mdata.GyroX,5);
//		OLED_ShowSignedNum(3,8,mdata.GyroY,5);
//		OLED_ShowSignedNum(4,8,mdata.GyroZ,5);
//	}
//}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//>>>>>>>>>>>>>>>>>>>>>>main for USART>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


//int main_Serial(void)
//{
//	u8 RxData;
//	struct Serial_String sstr;
//	OLED_Init();
//	Serial_Init();
//	Serial_SendByte(0x31);
//	Serial_SendString("\nFUck u\n");
//	Serial_SendNumber(12345);
//	Serial_SendNumber(654321);
//	Serial_SendNumber(5678);
//	Serial_SendNumber(321);
//	Serial_Printf("Fuck u %d\n",66);
//	int i = 0;
//	Serial_SetRxMode(Serial_RxMode_Cmd);
//	while(1)
//	{
//		if(Serial_GetAndClearRxFlag()) {
//			//RxData = Serial_GetRxByte();
//			sstr = Serial_GetRxCmd();
//			//OLED_ShowHexNum(1,1,RxData,2);
//			OLED_ShowNum(3,1,i++,4);
//			OLED_ShowNum(2,1,sstr.length,3);
//			OLED_ShowString(1,1,"                ");
//			OLED_ShowString(1,1,sstr.data);
//		}
//	}
//}


//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//>>>>>>>>>>>>>>>>>>>>>>main for ADC>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//u8 dataA[] = {0x31,0x32,0x33,0x34,0};
//u8 dataB[] = {0x30,0x30,0x30,0x30,0};
//u16 dataC[2];

//int main_ad_with_Dma() //实现连续扫描读取ad转换的结果，由DMA写入内存，在OLED显示
//{
//	OLED_Init();
//	AD_WithDMA_Init((u32)&dataC);
//	while(1){
//		AD_DMA_TransferValue();
//		OLED_ShowNum(1,1,dataC[0],4);
//		OLED_ShowNum(2,1,dataC[1],4);
//	}
//}

//int main_ad() //实现由软件控制的“连续”“扫描”读取ad转换的结果，由CPU写入内存，在OLED显示
//{
//	u16 adv;
//	OLED_Init();
//	OLED_ShowString(2,1,(char*)&dataA);
//	OLED_ShowString(3,1,(char*)dataB);
//	DMAConfig_Init((u32)dataA,(u32)dataB,5);
//	OLED_ShowString(4,1,(char*)dataB);
//	Delay_s(1);
//	DMAConfig_Transfer();
//	OLED_ShowString(4,1,(char*)dataB);
//	
//	//AD_Init(1); *(1)
//	AD_Init(0);
//	OLED_ShowString(1,1,"AD:");
//	while(1)
//	{
//		//adv = AD_GetValue(); *(1)
//		adv = AD_StartAndGetValue(ADC_Channel_3);
//		OLED_ShowNum(1,4,adv,4);
//		adv = AD_StartAndGetValue(ADC_Channel_4);
//		OLED_ShowNum(1,9,adv,4);
//		//注：可设置上阈值和下阈值来避免抖动造成判定的来回横跳
//	}
//}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//u16 light = 50;
//u16 angle = 0;
//int speed = 0;
//int main()  //A1由PWM2的CH2产生PWM波，在A6由IC捕获并计算占空比
//{                            //利用TIM1的两个通道获取Encoder的转速和方向，显示在LED屏幕上
//	OLED_Init();
//	PWM_TIM2_CH2_Init();
//	Timer_Int4_Init();
//	//InputCapture_Init();
//	Encoder_TIM_Init();
//	InputCapture_PWMI_Init();

//	OLED_ShowString(1,1,"Freq:");
//	OLED_ShowString(2,1,"Duty:");
//	//OLED_ShowString(3,1,"Code:");
//	PWM_TIM2_SetPrescaler(72-1); //Frep = 72M / (PSC+1) / (ARR+1)
//	PWM_TIM2_SetCompare2(66);     //Duty = CCR / (ARR+1) = CCR / 100
//	while(1)
//	{
//		OLED_ShowNum(1,6,InputCapture_GetFreq(),8);
//		OLED_ShowNum(2,6,InputCapture_GetDuty(),5);
//		//OLED_ShowSignedNum(3,6,speed,5);
//		//Delay_ms(10);
//	}
//}

//void TIM4_IRQHandler(void)
//{
//	if(TIM_GetITStatus(TIM4,TIM_IT_Update) != SET)
//		return;
//	speed = Encoder_TIM_GetCount();
//	TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
//}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//int main_for_PWM(void)
//{
//	Btn_Init();
//	Encoder_Init();
//	OLED_Init();
//	PWM_TIM2_CH1_Init();
//	Motor_Init();
//	Servo_Init();  //记录奇怪bug：若启用PA5为推挽输出，会使舵机失效
//	OLED_ShowString(1,1,"Light:");
//	OLED_ShowString(2,1,"Angle:");
//	OLED_ShowString(3,1,"Motor:");
//	while(1){
//		light += Encoder_GetCount()/4;
//		if(light>100){
//			light = light > 60000 ? 0 : 100;
//		}
//		if(Btn_GetKey() == 1) {
//			angle = angle == 180 ? 0 : angle+30;
//			Servo_SetAngle(angle);
//		}
//		PWM_TIM2_SetCompare1(light);
//		Motor_SetSpeed((((int)light)-50)*2);
//		OLED_ShowSignedNum(3,7,(((int)light)-50)*2,3);
//		OLED_ShowNum(1,7,light,3);
//		OLED_ShowNum(2,7,angle,3);
//	}
//}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//u16 Run_Time_Second = 0;
//u16 Ext_Int_Count = 0;
//void TIM2_IRQHandler(void)
//{
//	if(TIM_GetITStatus(TIM2,TIM_IT_Update) != SET)
//		return;
//	Run_Time_Second++;
//	TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
//}
//void LED_Init()
//{
//	//RCC->APB2ENR = 0x10;
//	//GPIOC->CRH = 0x00300000;
//	//GPIOC->ODR = 0x00002000;
//	GPIO_InitTypeDef GPIO_InitStructure;
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC,ENABLE);
//	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
//	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//	GPIO_Init(GPIOC,&GPIO_InitStructure);
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
//	GPIO_Init(GPIOA,&GPIO_InitStructure);
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
//}
//void Init1(void)
//{
//	Btn_Init();
//	LED_Init();
//	OLED_Init();
//	CountSensor_Init();
//	Encoder_Init();
//	//Timer_Ext2_Init();
//	Timer_Int2_Init();
//}
//int main1(void)
//{
//	Init1();
//	GPIO_ResetBits(GPIOC,GPIO_Pin_13);  //低电平
//	GPIO_SetBits(GPIOA,GPIO_Pin_0);     //高电平
//	OLED_ShowString(1,1,"S Count: ");
//	OLED_ShowNum(1,9,CountSensor_GetCount(),3);
//	OLED_ShowString(2,1,"E Count: ");
//	OLED_ShowSignedNum(2,9,Encoder_GetCount(),3);
//	OLED_ShowString(3,1,"RunTime: ");
//	OLED_ShowNum(3,9,Run_Time_Second,6);
//	OLED_ShowString(4,1,"ExI: ");
//	OLED_ShowNum(4,5,Ext_Int_Count,4);
//	OLED_ShowNum(4,11,TIM_GetCounter(TIM3),5);
//	BitAction Led = Bit_SET;
//	while(1){
//		if(Btn_GetKey() == 1) {
//			if(Led == Bit_RESET) {
//				Led = Bit_SET;
//			} else {
//				Led = Bit_RESET;
//			}
//		}
//		GPIO_WriteBit(GPIOA,GPIO_Pin_0,Led);
//		OLED_ShowNum(1,9,CountSensor_GetCount(),3);
//		OLED_ShowSignedNum(2,9,Encoder_GetCount(),3);
//		OLED_ShowNum(3,9,Run_Time_Second,6);
//		OLED_ShowNum(4,5,Ext_Int_Count,4);
//		OLED_ShowNum(4,11,TIM_GetCounter(TIM3),5);
//		Delay_ms(1);
//	}
//}
